﻿#include "AllPage.h"
#include "Display.h"

#define TAG "JogPop"
#include "CloudLog.h"

typedef struct {
    PAGE_BASE_OBJ* Pbo;										// 继承的页面基础对象结构体 必须要放在最前面
    int TickCnt;                                            // 计数器
    lv_obj_t* Circle;                                       // 闪烁对象
    lv_style_t Style;
    lv_style_t BorderStyle;
    lv_style_t TextStyle;
    lv_obj_t* TextViem;										// 视图对象指针，本页全局使用 关闭页面时记得摧毁
    int TextIndex;                                          // 用于记录当前显示的文字索引
    bool IsMute;                                            // 是否是静音
    int Type;                                               // 打开页面的类型
} PAGE_GLOBAL_VARIABLE;										// 本页使用的全局变量结构体
static PAGE_GLOBAL_VARIABLE* pgvar;							// 本页使用的全局 页面关闭会摧毁		


typedef enum {
    STATE_MIC_VOL1 = 0,                                     // 话筒1音量
    STATE_MIC_VOL2 = 1,                                     // 话筒2音量
    STATE_MIC_ECHO = 2,                                     // 话筒回声比例
    STATE_VOL = 3,                                          // 主音量
} MIC_STATE;

static const int tabJogText[] = {                           // MIC1音量  MIC2音量  MIC回声比例  主音量
    STR12_MIC_1VOL, STR12_MIC_2VOL, STR12_MIC_ECHO, STR12_VOLUME
};
static const int tabJogTextSize = sizeof(tabJogText) / sizeof(tabJogText[0]);

static const int TabTextViem[] = {                        // MIC1音量  MIC2音量  MIC回声比例 主音量
    STR12_MIC_1VOL,     STR12_EMP_MIC_1VOL,
    STR12_MIC_2VOL,     STR12_EMP_MIC_2VOL,
    STR12_MIC_ECHO,     STR12_EMP_MIC_ECHO,
    STR12_VOLUME,       STR12_EMP_VOLUME,
    0, 0,
};

static void ShowTextViem(RES_ENUM_STRING12 resenum, ...) {  // 文字闪烁
    char text[128];
    va_list args;
    const char* fmt;
    int offset = 0;
#ifdef PANEL_NONE_CHINESE                                   // 面板显示屏不支持中文点阵显示
    int cntA = pgvar->TickCnt % 2;
    if (cntA == 0) {
        offset = resenum;
    }
    else {
        for (int index = 0; ; index++) {
            int input = TabTextViem[(index * 2) + 0];      // 显示的文字和数值
            int flash = TabTextViem[(index * 2) + 1];      // 只显示文字，不显示数值，达到闪烁的效果
            if (input != 0 || text != 0) {                 // 如果不是0的时候显示相应的文字
                if (input == resenum) {
                    offset = flash;
                    break;
                }
            }
            else {
                break;
            }
        }
    }
#else
    offset = resenum;
#endif

    fmt = (const char*)LvglGetTabResource() + offset;   // 根据 resenum 偏移获取格式化字符串
    va_start(args, resenum);
    int length = vsnprintf(text, sizeof(text) - 1, fmt, args);
    if (length > 0) {
        text[length] = 0;
    }
    va_end(args);
    LvglGlyphStr12Utf8(pgvar->TextViem, text);
    DisplayNoCnText(text);
}

static void SetMicValue(MIC_STATE type, uint8_t value) {
    switch (type) {
    case STATE_MIC_VOL1:     // 话筒1音量
    case STATE_MIC_VOL2:     // 话筒2音量
        Kc3xSetMicVolume(type == STATE_MIC_VOL2, value);
        break;
    case STATE_MIC_ECHO:    // 话筒回声比例
        Kc3xSetMicEcho(value);
        break;
    default:
        break;
    }
}

static uint8_t GetValue(MIC_STATE type) {
    int value;
    switch (type) {
    case STATE_MIC_VOL1:                                    // 话筒1音量
    case STATE_MIC_VOL2:                                    // 话筒2音量
        value = Kc3xGetMicVolume(type == STATE_MIC_VOL2);   // 读取话筒1的音量
        break;
    case STATE_MIC_ECHO:                                    // 话筒回声比例
        value = Kc3xGetMicEcho();   
        break;
    case STATE_VOL:                                         // 主音量
        value = Kc3xGetVolume();
        SymbolViewShow();                                   // 刷新后台显示数值
        break;
    default:
        value = 0;
        break;
    }
    return value;
}

static void SetMicVolume(bool isUp) {                       // 设置话筒和主音量
    if (pgvar->TextIndex == STATE_VOL) {                    // 主音量
        if (Kc3xGetMute()) {				                // 如果是静音时(配合噪音测试使用)
            Kc3xSetMute(false);
        }
        uint8_t volume = GetValue(pgvar->TextIndex);
        if (isUp) {
            if (volume < VOLUME_MAX) {                      // 最大数值
                volume++;
            }
        }
        else {
            if (volume > 0) {
                volume--;
            }
        }
        Kc3xSetVolume(volume);
    }
    else {                                                  // 话筒调节
        uint8_t mic = GetValue(pgvar->TextIndex);
        if (isUp) {
            if (mic < MIC_MAX) {
                ++mic;							            // 数值增加
            }
        }
        else {
            if (mic > 0) {
                --mic;
            }
        }
        SetMicValue(pgvar->TextIndex, mic);                 // 设置数值   
    }
}

//根据操作更新显示
static void updateDisplay() {
    //CLOGI(TAG, "右旋转按钮 JogPop 显示音量 (%d)", GetValue(pgvar->TextIndex));
    ShowTextViem(tabJogText[pgvar->TextIndex], GetValue(pgvar->TextIndex));
}

// 处理遥控器按键事件
static bool msgListener(void* arg, int value) {
    CLOGI(TAG, "JogPop 显示数值TTT（%x）（%x）(%x)(%x)", (value & DMT_MASK), DMT_REFRESH, value, value & 0xff);
    if ((value & DMT_MASK) == DMT_REFRESH) {                // 保留前面两位数，后面全置0再和DMT_REFRESH比较
        pgvar->TickCnt = 0;
        updateDisplay();
        return false;                                       // 返回不往下工作
    }
    switch (value) {
    case DMT_KEY | KEY_JOP_ENTER:					        // 旋转按钮的按压键功能 KEY 0x08
        pgvar->TextIndex = (pgvar->TextIndex + 1) % tabJogTextSize;
        break;
    case DMT_JOG | DMT_JOG_RIGHT:   					    // 右旋转按钮（+） 0x02
    case DMT_IR | IR_MIC_UP:                                // 话筒调节+ 0x70
    case DMT_IR | IR_VOLUME_UP:                             // 音量+ 0xb0
        SetMicVolume(true);                                 // 设置话筒和主音量
        break;
    case DMT_JOG | DMT_JOG_LEFT:   							// 左旋转按钮（-） 0x01
    case DMT_IR | IR_MIC_DN:                                // 话筒调节- 0x48
    case DMT_IR | IR_VOLUME_DN:                             // 音量- 0x88
        SetMicVolume(false);                                // 设置话筒和主音量
        break;


    // 以下操作是关闭本页面去别的页面
    case DMT_IR | IR_BRIGHTNESS:    		                // 亮度（按键）0x1a	
        JogPopClose();
        return OpenAdjustPop(ADJT_BRIGHTNESS);
    case DMT_IR | IR_MIC_CTRL:          	                // 音调话筒（按键）0x18   
        JogPopClose();
        return OpenEqToneMicPop(ADJT_MIC);
    case DMT_IR | IR_TEST_TONE:                             // 噪音测试（按键）0xa2
        JogPopClose();                                      // 本页面关闭
        DriverSetMessage(DMT_IR, IR_TEST_TONE);             // 其他消息导致本页面关闭 重新驱动推送消息给应用层继续处理本消息
        return true;
    case DMT_KEY | KEY_MUTE:                                // 静音（按键）0x108（面板）
    case DMT_IR | IR_MUTE:                                  // 静音（按键）0xa0（遥控器）
        JogPopClose();                                      // 本页面关闭
        return OpenAdjustPop(ADJT_MUTE);
    case DMT_IR | IR_MENU_CTRL:             // 菜单（按键）0x58
        JogPopClose();
        if (PageFindByName(PAGE_PANEL, "MenuSetPage") == NULL) {   // 菜单页面还没有打开
            PAGE_CARRY_BASE carry;
            PageCarryInit(PAGE_PANEL, PSTY_NORMAL, &carry, sizeof(PAGE_CARRY_BASE));
            PageStart(MenuSetPageStart, "MenuSetPage", &carry);
            return true;    // true的时候，按键的数值不再往下一个页面传递，false会把按键的数值传到新的页面中
        }
        break;
    case DMT_KEY | KEY_EQ:                                  // 音效 0x201（面板）
    case DMT_IR | IR_EQ:                                    // 音效 0x72（遥控器）
        JogPopClose();
        return OpenEqToneMicPop(ADJT_EQ_SELECT);
    case DMT_IR | IR_NIGTT_MODE:   			                // 夜间模式 0x32
        JogPopClose();
        return OpenAdjustPop(ADJT_NIGTT_MODE);
    case DMT_KEY | KEY_STEREO:                              // 立体声 0x204（面板）
    case DMT_IR | IR_STEREO:                                // 立体声 0x52（遥控器）
        JogPopClose();
        return OpenAdjustPop(ADJT_LISTEN_MODE);
    case DMT_KEY | KEY_SURROUND:                            // 多声道 0x202（面板）
    case DMT_IR | IR_SURROUND:                              // 多声道 0x12（遥控器）
        JogPopClose();
        return OpenAdjustPop(ADJT_LISTEN_MODE);
    case DMT_IR | IR_INPUT_OPTICA:                          // 光纤 0x42
        JogPopClose();
        Kc3xSetInSource(KCM_INPUT_RX1);
        return OpenAdjustPop(ADJT_INPUT_SOURCE);
    case DMT_IR | IR_INPUT_COAXAL1:                         // 同轴1 0x02
        JogPopClose();
        Kc3xSetInSource(KCM_INPUT_RX2);
        return OpenAdjustPop(ADJT_INPUT_SOURCE);
    case DMT_IR | IR_INPUT_COAXAL2:                         // 同轴2 0x00
        JogPopClose();
        Kc3xSetInSource(KCM_INPUT_RX3);
        return OpenAdjustPop(ADJT_INPUT_SOURCE);
    case DMT_IR | IR_INPUT_AUX:                             // 模拟 0xc0
        JogPopClose();
        Kc3xSetInSource(KCM_INPUT_ANALOG);
        return OpenAdjustPop(ADJT_INPUT_SOURCE);
    case DMT_IR | IR_INPUT_HDMI1:                           // HDMI1 0x62
        JogPopClose();
        Kc3xSetInSource(KCM_INPUT_HDMI1);
        return OpenAdjustPop(ADJT_INPUT_SOURCE);
    case DMT_IR | IR_INPUT_HDMI2:                           // HDMI2 0x22
        JogPopClose();
        Kc3xSetInSource(KCM_INPUT_HDMI2);
        return OpenAdjustPop(ADJT_INPUT_SOURCE);
    case DMT_IR | IR_INPUT_HDMI3:                           // HDMI3 0x20
        JogPopClose();
        Kc3xSetInSource(KCM_INPUT_HDMI3);
        return OpenAdjustPop(ADJT_INPUT_SOURCE);
    case DMT_IR | IR_INPUT_HDMI_ARC:                        // HDMI-ARC 0xe0
        JogPopClose();
        Kc3xSetInSource(KCM_INPUT_ARC);
        return OpenAdjustPop(ADJT_INPUT_SOURCE);


    default:
        return false;
    }
    pgvar->TickCnt = 0;
    updateDisplay();                                        // 更新显示
    return false;
}

static void timListener(void* arg) {
#ifdef PANEL_NONE_CHINESE                                   // 面板显示屏不支持中文点阵显示
    if (pgvar->TickCnt++ > 4) {								// 闪烁8次
        JogPopClose();                               // 关闭页面
        return;
    }
    updateDisplay();                                        // 更新显示
    PageTimListener(pgvar->Pbo, timListener, 1000);			// 隔1秒闪烁一次
#else
    if (pgvar->TickCnt++ > 8) {								// 闪烁8次
        JogPopClose();                                   // 关闭页面
        //CLOGI(TAG, "自动 关闭JogPop页面");
        return;
    }
    int cnt = pgvar->TickCnt % 2;
    if (cnt == 0) {
        DisplaySetStyleColor(pgvar->Circle, &pgvar->Style, lv_color_white());// 圆点的颜色
        lv_style_set_radius(&pgvar->Style, 4);				// 设置圆角
    }
    else {
        DisplaySetStyleColor(pgvar->Circle, &pgvar->Style, lv_color_black());// 圆点的颜色
        lv_style_set_radius(&pgvar->Style, 4);				// 设置圆角
    }
    PageTimListener(pgvar->Pbo, timListener, 500);			// 隔500毫秒闪烁一次
#endif
}

static void viewInit(PAGE_VIEW_BASE* viewGroup) {
    //lv_obj_set_size(viewGroup, 128, 32);                    // 设置视图的大小
    lv_obj_set_size(viewGroup->Object, PANEL_WIDTH, PANEL_HEIGHT / 2);                    // 设置视图的大小
    lv_obj_align(viewGroup->Object, LV_ALIGN_CENTER, 0, 0);         // 居中显示
    //lv_obj_set_style_bg_color(viewGroup, lv_color_white(), LV_PART_MAIN);    // 设置视图的背景颜色为白色

    lv_style_init(&pgvar->BorderStyle);
    lv_style_set_border_width(&pgvar->BorderStyle, 2);                  // 边框大小 v7参数：style, width
    lv_style_set_border_color(&pgvar->BorderStyle, lv_color_white());   // 边框颜色 v7参数：style, color
    //lv_style_set_bg_opa(&pgvar->BorderStyle, LV_OPA_TRANSP);            // 背景透明 v7参数：style, opa
    lv_style_set_bg_opa(&pgvar->BorderStyle, LV_OPA_COVER);            // 背景不透明 v7参数：style, opa    
    lv_obj_add_style(viewGroup->Object, &pgvar->BorderStyle, 0);                // 应用样式（v7中第三个参数是选择器，0表示默认状态）

    pgvar->Circle = lv_obj_create(viewGroup->Object);
    lv_obj_set_size(pgvar->Circle, 8, 8);                   // 圆点的大小
    //lv_obj_set_pos(pgvar->Circle, 117, 3);                  // 圆点的位置（无边框的设置）
    lv_obj_set_pos(pgvar->Circle, 114, 3);                  // 圆点的位置
    DisplaySetStyleColor(pgvar->Circle, &pgvar->Style, lv_color_white());// 圆点的颜色
    //DisplaySetStyleColor(pgvar->Circle, &pgvar->Style, lv_color_black());// 圆点的颜色（无边框的设置）
    lv_style_set_radius(&pgvar->Style, 4);					// 设置圆角
    lv_obj_add_style(pgvar->Circle, &pgvar->Style, 0);

    // 文本标签的样式(处理文字超出显示问题)
    lv_style_init(&pgvar->TextStyle);                                   // 设置文本居中对齐（旧版本通过样式设置）
    lv_style_set_text_align(&pgvar->TextStyle, LV_TEXT_ALIGN_CENTER);   // 可以在这里添加其他文本样式设置，如字体大小等
    pgvar->TextViem = lv_label_create(viewGroup->Object);                       // 创建一个标签对象并添加到视图组中
    lv_obj_set_width(pgvar->TextViem, PANEL_WIDTH);                     // 留一些边距，避免与圆点重叠
    lv_label_set_long_mode(pgvar->TextViem, LV_LABEL_LONG_MODE_DOTS);   // 启用省略号模式
    lv_obj_add_style(pgvar->TextViem, &pgvar->TextStyle, 0);            // 应用样式

    #ifndef PANEL_NONE_CHINESE                              // 面板显示屏支持中文显示
        //lv_obj_align(pgvar->TextViem, LV_ALIGN_CENTER, 0, 0);	// 对象在参考对象中水平和垂直都居中对齐
        lv_obj_center(pgvar->TextViem);                         // 自动水平和垂直居中
    # else
        lv_obj_align(pgvar->TextViem, LV_ALIGN_CENTER, 0, 0);	// 对象在参考对象中水平和垂直都居中对齐
    #endif

    LvglGlyphBindTextView(GLYPH_STRING12, pgvar->TextViem, RTCOLOR_WHITE, 0, 1);   // 绑定字体、颜色和位置
    //LvglGlyphBindTextView(GLYPH_STRING12, pgvar->TextViem, RTCOLOR_BLACK, 0, 1);   // 绑定字体、颜色和位置（无边框的设置）

    //pgvar->TextIndex = Kc3xGetMemory(2);                // 读取旋转按钮选中的类型
    pgvar->TextIndex = 0;                // 读取旋转按钮选中的类型
    updateDisplay();
}
////////////////////////////////////////////////////////////////////////////////////////////////// 
// 页面前面一般定义变量及处理内部业务逻辑 一般使用静态变量及函数 static 就不容易出现同名函数冲撞了
////////////////////////////////////////////////////////////////////////////////////////////////// 

// 页面关闭函数 注意记得删除所有新建的view
void JogPopClose(void) {
    lv_obj_delete(pgvar->TextViem);
    lv_obj_delete(pgvar->Circle);
    PageClose(pgvar->Pbo);                                  // 关闭页面
}
bool JogPopStart(PAGE_BASE_OBJ* pbo, PAGE_CARRY_BASE* carry) {
    pgvar = PageInfoNew(pbo, sizeof(PAGE_GLOBAL_VARIABLE), carry);
    if (pgvar != NULL) {
        PAGE_CARRY_MORE* more = (PAGE_CARRY_MORE*)carry;
        viewInit(&carry->ViewGroup);
        PageMsgListener(pbo, msgListener);
        PageTimListener(pbo, timListener, 2000);
        return true;
    }
    return false;
}

bool OpenJogPop(ADJUST_TYPE adjt) {
    PAGE_BASE_OBJ* pbo = PageFindByName(PAGE_PANEL, "JogPop");
    if (pbo != NULL) {                                          // 页面已打开
        PAGE_CARRY_MORE* more = (PAGE_CARRY_MORE*)&pbo->Carry;  // 强制转换为PAGE_CARRY_MORE
        if (more->Value == adjt) {                              // 如果类型相同
            return false;
        }
        JogPopClose();
    }
    PAGE_CARRY_MORE carry = { 0 };
    PageCarryInit(PAGE_PANEL, PSTY_POP, &carry.Base, sizeof(PAGE_CARRY_BASE));
    carry.Value = adjt;
    PageStart(JogPopStart, "JogPop", &carry.Base);
    return true;    // true的时候，按键的数值不再往下一个页面传递，false会把按键的数值传到新的页面中
}